/************************************************************
* @file   rtc_regs.h
************************************************************/

#ifndef RTC_REGS_H
#define RTC_REGS_H

#include "gkt_types.h"
#include "gkt_defines.h"
#include "gkt_date_time.h"
#include "g_rtc.h"

#define RTC_YEAR_BASE	2000
#define RTC_YEAR_MAX	64
#define RTC_YEAR_END	(RTC_YEAR_BASE + RTC_YEAR_MAX)


#define RTC_ENCFG	0x00	/* RTC使能Register 0x01 */
#define RTC_SECCFG	0x04	/* RTC秒时间校准值设置Register 0x7fff */
#define RTC_IECFG	0x08	/* RTC Interrupt Config Register 0x00 */
#define RTC_IRQSTA	0x0C	/* RTC Interrupt Status Register 0x00 */
#define RTC_ALMCFG	0x10	/* RTC闹钟中断设置值Register 0xffff */
#define RTC_TIMECRU	0x14	/* RTC计数值读写Register 0x00 */

/* DTIR / DTRR Fields shift, bits */
#define RTC_SEC_BITS	6
#define RTC_MIN_BITS	6
#define RTC_HOUR_BITS	5
#define RTC_DAY_BITS	5
#define RTC_MON_BITS	4
#define RTC_YEAR_BITS	6

#define RTC_SEC_SHIFT	0
#define RTC_MIN_SHIFT	(RTC_SEC_SHIFT + RTC_SEC_BITS)
#define RTC_HOUR_SHIFT	(RTC_MIN_SHIFT + RTC_MIN_BITS)
#define RTC_DAY_SHIFT	(RTC_HOUR_SHIFT + RTC_HOUR_BITS)
#define RTC_MON_SHIFT	(RTC_DAY_SHIFT + RTC_DAY_BITS)
#define RTC_YEAR_SHIFT	(RTC_MON_SHIFT + RTC_MON_BITS)

#define RTC_FIELD_MASK(name)	\
	gkt_mask(RTC_##name##_BITS, RTC_##name##_SHIFT)
#define RTC_SEC_MASK	RTC_FIELD_MASK(SEC)
#define RTC_MIN_MASK	RTC_FIELD_MASK(MIN)
#define RTC_HOUR_MASK	RTC_FIELD_MASK(HOUR)
#define RTC_DAY_MASK	RTC_FIELD_MASK(DAY)
#define RTC_MON_MASK	RTC_FIELD_MASK(MON)
#define RTC_YEAR_MASK	RTC_FIELD_MASK(YEAR)

#define RTC_BUILD_DT_REGVAL(dt_regval, dt_struct)	\
	do {	\
		dt_regval = ((uint32_t)((dt_struct)->date.year - RTC_YEAR_BASE) << RTC_YEAR_SHIFT) \
					| ((uint32_t)(dt_struct)->date.month << RTC_MON_SHIFT) \
					| ((uint32_t)(dt_struct)->date.day << RTC_DAY_SHIFT) \
					| ((uint32_t)(dt_struct)->time.hour << RTC_HOUR_SHIFT) \
					| ((uint32_t)(dt_struct)->time.minute << RTC_MIN_SHIFT) \
					| ((uint32_t)(dt_struct)->time.second << RTC_SEC_SHIFT);	\
	} while(0)
#define RTC_BUILD_DT_STRUCT(dt_struct, dt_regval)	\
	do {	\
		(dt_struct)->date.year = (((dt_regval) & RTC_YEAR_MASK) >> RTC_YEAR_SHIFT) + RTC_YEAR_BASE;	\
		(dt_struct)->date.month = ((dt_regval) & RTC_MON_MASK) >> RTC_MON_SHIFT;	\
		(dt_struct)->date.day = ((dt_regval) & RTC_DAY_MASK) >> RTC_DAY_SHIFT;	\
		(dt_struct)->time.hour = ((dt_regval) & RTC_HOUR_MASK) >> RTC_HOUR_SHIFT;	\
		(dt_struct)->time.minute = ((dt_regval) & RTC_MIN_MASK) >> RTC_MIN_SHIFT;	\
		(dt_struct)->time.second = ((dt_regval) & RTC_SEC_MASK) >> RTC_SEC_SHIFT;	\
		(dt_struct)->time.reserved = 0;	\
	} while(0)


#endif	/* RTC_REGS_H */

